package SourceCode.FunctionInterface.code;

import java.util.Objects;
import java.util.function.Predicate;

/**
 * @Description 返回一个boolean返回值
 * @Author bloodcolding
 * @Date 2021/01/23 5:30 PM
 */
public class ImpPredict<T> implements Predicate<T> {
    /**
     * 返回一个boolean值
     *
     * @param t
     * @return
     */
    @Override
    public boolean test(T t) {
        return false;
    }

    /**
     * 布尔函数 and
     *
     * @param other
     * @return
     */
    @Override
    public Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    /**
     * 布尔函数 非
     *
     * @return
     */
    @Override
    public Predicate<T> negate() {
        return (t) -> !test(t);
    }

    /**
     * 布尔函数 or
     *
     * @param other
     * @return
     */
    @Override
    public Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    /**
     * 判断参数是否为空，不为空时用equals()方法比较自身；
     *
     * @param targetRef
     * @param <T>
     * @return
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }

    /**
     * 返回预测值的 非，通过negate()方法实现
     *
     * @param target
     * @param <T>
     * @return
     */
    static <T> Predicate<T> not(Predicate<? super T> target) {
        Objects.requireNonNull(target);
        return (Predicate<T>) target.negate();
    }
}
